package models

import (
	"time"

	"github.com/beego/beego/v2/client/orm"
	"github.com/beego/beego/v2/core/logs"
)

// Meituan 美团配置信息
type Meituan struct {
	BaseModel
	StoreId      int64  `orm:"index" json:"store_id"`            // 关联门店ID
	StoreName    string `orm:"size(100)" json:"store_name"`      // 门店名称（冗余字段）
	AppKey       string `orm:"size(100)" json:"app_key"`         // 美团开放平台应用AppKey
	AppSecret    string `orm:"size(100)" json:"app_secret"`      // 美团开放平台应用AppSecret
	PoiId        string `orm:"size(50)" json:"poi_id"`           // 美团门店ID（POI ID）
	Status       int    `orm:"default(1)" json:"status"`         // 状态：0-禁用，1-启用
	SyncInterval int    `orm:"default(30)" json:"sync_interval"` // 订单同步间隔（分钟）
	LastSyncTime int64  `json:"last_sync_time"`                  // 最后同步时间
}

// MeituanOrder 美团订单
type MeituanOrder struct {
	BaseModel
	MeituanId      int64  `orm:"index" json:"meituan_id"`               // 关联美团配置ID
	StoreId        int64  `orm:"index" json:"store_id"`                 // 关联门店ID
	OrderId        string `orm:"size(50);index;unique" json:"order_id"` // 美团订单ID
	OrderStatus    int    `orm:"default(0)" json:"order_status"`        // 订单状态：0-未处理，1-已确认，2-已拒绝，3-已完成
	OrderType      int    `orm:"default(0)" json:"order_type"`          // 订单类型：1-预订，2-堂食，3-外卖
	TotalAmount    int64  `json:"total_amount"`                         // 订单总金额（分）
	Payment        int64  `json:"payment"`                              // 实付金额（分）
	CustomerName   string `orm:"size(50)" json:"customer_name"`         // 顾客姓名
	CustomerPhone  string `orm:"size(20)" json:"customer_phone"`        // 顾客电话
	CustomerCount  int    `json:"customer_count"`                       // 就餐人数
	BookingTime    int64  `json:"booking_time"`                         // 预订时间
	BookingEndTime int64  `json:"booking_end_time"`                     // 预订结束时间
	Remark         string `orm:"size(500)" json:"remark"`               // 备注
	IsProcessed    int    `orm:"default(0)" json:"is_processed"`        // 是否已处理：0-否，1-是
	ProcessTime    int64  `json:"process_time"`                         // 处理时间
}

// 表初始化
func init() {
	// 模型已在base.go的registerModels函数中注册
}

// 获取分页的美团配置列表
func GetMeituanList(page, pageSize int, filters map[string]interface{}) ([]*Meituan, int64, error) {
	o := GetOrm()
	query := o.QueryTable(new(Meituan)).Filter("is_deleted", 0)

	// 应用过滤条件
	if storeId, ok := filters["store_id"].(int64); ok && storeId > 0 {
		query = query.Filter("store_id", storeId)
	}
	if status, ok := filters["status"].(int); ok {
		query = query.Filter("status", status)
	}

	// 查询总数
	total, err := query.Count()
	if err != nil {
		logs.Error("获取美团配置总数失败: %v", err)
		return nil, 0, err
	}

	// 查询分页数据
	var list []*Meituan
	_, err = query.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&list)
	if err != nil {
		logs.Error("获取美团配置列表失败: %v", err)
		return nil, 0, err
	}

	return list, total, nil
}

// 添加美团配置
func AddMeituan(meituan *Meituan) (int64, error) {
	o := GetOrm()
	id, err := o.Insert(meituan)
	if err != nil {
		logs.Error("添加美团配置失败: %v", err)
		return 0, err
	}
	return id, nil
}

// 根据ID获取美团配置
func GetMeituanById(id int64) (*Meituan, error) {
	o := GetOrm()
	meituan := &Meituan{}
	meituan.BaseModel.Id = id
	err := o.Read(meituan)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据ID获取美团配置失败: %v", err)
		return nil, err
	}
	if meituan.IsDeleted == 1 {
		return nil, nil
	}
	return meituan, nil
}

// 根据门店ID获取美团配置
func GetMeituanByStoreId(storeId int64) (*Meituan, error) {
	o := GetOrm()
	meituan := &Meituan{}
	err := o.QueryTable(new(Meituan)).
		Filter("store_id", storeId).
		Filter("is_deleted", 0).
		One(meituan)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据门店ID获取美团配置失败: %v", err)
		return nil, err
	}
	return meituan, nil
}

// 更新美团配置
func UpdateMeituan(meituan *Meituan) error {
	o := GetOrm()
	_, err := o.Update(meituan)
	if err != nil {
		logs.Error("更新美团配置失败: %v", err)
		return err
	}
	return nil
}

// 删除美团配置（软删除）
func DeleteMeituan(id int64) error {
	o := GetOrm()
	meituan := &Meituan{}
	meituan.BaseModel.Id = id
	err := o.Read(meituan)
	if err != nil {
		logs.Error("删除美团配置时查询失败: %v", err)
		return err
	}
	meituan.IsDeleted = 1
	_, err = o.Update(meituan, "IsDeleted")
	if err != nil {
		logs.Error("删除美团配置失败: %v", err)
		return err
	}
	return nil
}

// 获取分页的美团订单列表
func GetMeituanOrderList(page, pageSize int, filters map[string]interface{}) ([]*MeituanOrder, int64, error) {
	o := GetOrm()
	query := o.QueryTable(new(MeituanOrder)).Filter("is_deleted", 0)

	// 应用过滤条件
	if storeId, ok := filters["store_id"].(int64); ok && storeId > 0 {
		query = query.Filter("store_id", storeId)
	}
	if orderStatus, ok := filters["order_status"].(int); ok {
		query = query.Filter("order_status", orderStatus)
	}
	if isProcessed, ok := filters["is_processed"].(int); ok {
		query = query.Filter("is_processed", isProcessed)
	}
	if startTime, ok := filters["start_time"].(time.Time); ok {
		query = query.Filter("create_time__gte", startTime)
	}
	if endTime, ok := filters["end_time"].(time.Time); ok {
		query = query.Filter("create_time__lte", endTime)
	}

	// 查询总数
	total, err := query.Count()
	if err != nil {
		logs.Error("获取美团订单总数失败: %v", err)
		return nil, 0, err
	}

	// 查询分页数据
	var list []*MeituanOrder
	_, err = query.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&list)
	if err != nil {
		logs.Error("获取美团订单列表失败: %v", err)
		return nil, 0, err
	}

	return list, total, nil
}

// 添加美团订单
func AddMeituanOrder(order *MeituanOrder) (int64, error) {
	o := GetOrm()
	id, err := o.Insert(order)
	if err != nil {
		logs.Error("添加美团订单失败: %v", err)
		return 0, err
	}
	return id, nil
}

// 根据ID获取美团订单
func GetMeituanOrderById(id int64) (*MeituanOrder, error) {
	o := GetOrm()
	order := &MeituanOrder{}
	order.BaseModel.Id = id
	err := o.Read(order)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据ID获取美团订单失败: %v", err)
		return nil, err
	}
	if order.IsDeleted == 1 {
		return nil, nil
	}
	return order, nil
}

// 根据美团订单ID获取订单信息
func GetMeituanOrderByOrderId(orderId string) (*MeituanOrder, error) {
	o := GetOrm()
	order := &MeituanOrder{}
	err := o.QueryTable(new(MeituanOrder)).
		Filter("order_id", orderId).
		Filter("is_deleted", 0).
		One(order)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据美团订单ID获取订单失败: %v", err)
		return nil, err
	}
	return order, nil
}

// 更新美团订单
func UpdateMeituanOrder(order *MeituanOrder) error {
	o := GetOrm()
	_, err := o.Update(order)
	if err != nil {
		logs.Error("更新美团订单失败: %v", err)
		return err
	}
	return nil
}

// 处理美团订单
func ProcessMeituanOrder(id int64, status int) error {
	o := GetOrm()
	order := &MeituanOrder{}
	order.BaseModel.Id = id
	err := o.Read(order)
	if err != nil {
		logs.Error("处理美团订单时查询失败: %v", err)
		return err
	}
	order.OrderStatus = status
	order.IsProcessed = 1
	order.ProcessTime = time.Now().Unix()
	_, err = o.Update(order, "OrderStatus", "IsProcessed", "ProcessTime")
	if err != nil {
		logs.Error("处理美团订单失败: %v", err)
		return err
	}
	return nil
}

// 删除美团订单（软删除）
func DeleteMeituanOrder(id int64) error {
	o := GetOrm()
	order := &MeituanOrder{}
	order.BaseModel.Id = id
	err := o.Read(order)
	if err != nil {
		logs.Error("删除美团订单时查询失败: %v", err)
		return err
	}
	order.IsDeleted = 1
	_, err = o.Update(order, "IsDeleted")
	if err != nil {
		logs.Error("删除美团订单失败: %v", err)
		return err
	}
	return nil
}

// GetMeituanGroupOrderByCode 根据券码获取美团团购订单
func GetMeituanGroupOrderByCode(code string) (*MeituanGroupOrder, error) {
	o := GetOrm()
	order := &MeituanGroupOrder{}
	err := o.QueryTable(new(MeituanGroupOrder)).Filter("voucher_code", code).One(order)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据券码获取美团团购订单失败: %v", err)
		return nil, err
	}
	return order, nil
}
